package com.java.star.mall.common.response;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

/**
 * 统一响应结果类
 */
@Data
public class JsonResult<T> implements Serializable {

    @ApiModelProperty(value = "业务状态码")
    private Integer state;

    @ApiModelProperty(value = "提示文本")
    private String message;

    @ApiModelProperty(value = "响应数据")
    private T data;

    /**
     * 生成含有响应数据的请求成功对象
     *
     * @param data 需要返回的数据
     * @return 请求成功对象
     */
    public static <T> JsonResult<T> ok(T data) {
        JsonResult<T> jsonResult = new JsonResult<>();
        jsonResult.setState(StatusCode.SUCCESS.getCode());
        jsonResult.setMessage(StatusCode.SUCCESS.getMsg());
        jsonResult.setData(data);
        return jsonResult;
    }

    /**
     * 生成不含有响应数据的请求成功对象
     *
     * @return 请求成功对象
     */
    public static JsonResult<Void> ok() {
        return ok(null);
    }

    /**
     * 生成失败响应数据对象
     *
     * @param statusCode 状态枚举类
     * @return 请求失败对象
     */
    public static JsonResult<Void> fail(StatusCode statusCode) {
        JsonResult<Void> jsonResult = new JsonResult<>();
        jsonResult.setState(statusCode.getCode());
        jsonResult.setMessage(statusCode.getMsg());
        return jsonResult;
    }

    /**
     * 生成自定义状态码和响应消息的失败响应数据对象
     *
     * @param code    失败状态码
     * @param message 失败消息
     * @return 请求失败对象
     */
    public static JsonResult<Void> fail(Integer code, String message) {
        JsonResult<Void> jsonResult = new JsonResult<>();
        jsonResult.setState(code);
        jsonResult.setMessage(message);
        return jsonResult;
    }

}
